/**
 * --------------- 单选多选框事件交互 ---------------
 */

define(function () {
	/**
	 * [checkBoxSelectAll 针对数据列表操作列 全选操作]
	 */
	var checkBoxSelectAll = {
	    init: function (opt) { //初始化及配置
	        var opt = opt || {};
	        var defaults = {
	            allBtn: "[data-type='select_all']", //全选按钮选择规则
	            childBtn: "[data-role='checkbox']", //全选按钮对应的子按钮
	            isHasHiddenInp: false, //是否有隐藏的input元素-默认是没有
	            btnSelectedClass: "on", //模拟框选中的class值
	            dataString: { //数据字符配置
	                attr: "data-data-string",
	                fuhao: ","
	            },
	            delegate: {
	                isDelegate: true, //默认是代理模式
	                delegateEle: document
	            },
	            call_all: "", //全选按钮的回调函数
	            call_child: "" //子按钮的回调函数
	        }
	        this.config = $.extend({}, defaults, opt);

	        // 方法区域
	        this.bindEventAllClick();
	        this.bnidEventChildClick();
	    },
	    bindEventAllClick: function () { //全选按钮绑定事件
	        var _this = this;
	        if( _this.getIsDelegate() ){ //若果是代理模式
	            $(_this.config.delegate.delegateEle).on("click", _this.config.allBtn, function (ev) {
	                var oEv = ev || window.event;
	                oEv.preventDefault();
	                oEv.stopPropagation();
	                if(!_this.config.isHasHiddenInp){ //没有隐藏的输入框（向后端传值）
	                    if( !$(this).hasClass(_this.config.btnSelectedClass) ){ //如果为选中
	                        $(this).addClass(_this.config.btnSelectedClass);
	                        $(_this.config.childBtn).addClass(_this.config.btnSelectedClass);
	                    }else{
	                        $(this).removeClass(_this.config.btnSelectedClass);
	                        $(_this.config.childBtn).removeClass(_this.config.btnSelectedClass);
	                    }
	                }else{ //有隐藏的输入框

	                }
	                // 回调函数-参数为 类对象本身
	                _this.config.call_all && _this.config.call_all(_this);
	            });
	        }else{

	        }
	    },
	    bnidEventChildClick: function () { //子按钮绑定事件
	        var _this = this;
	        if( _this.getIsDelegate() ){ //若果是代理模式
	            $(_this.config.delegate.delegateEle).on("click", _this.config.childBtn, function (ev) {
	                var oEv = ev || window.event;
	                oEv.preventDefault();
	                oEv.stopPropagation();
	                if(!_this.config.isHasHiddenInp){ //没有隐藏的输入框（向后端传值）
	                    if( !$(this).hasClass(_this.config.btnSelectedClass) ){ //如果为选中
	                        $(this).addClass(_this.config.btnSelectedClass);
	                    }else{
	                        $(this).removeClass(_this.config.btnSelectedClass);
	                    }
	                    _this.setAllBtnStatus();
	                }else{ //有隐藏的输入框

	                }
	                // 回调函数-参数为 繁盛事件元素本身
	                _this.config.call_child && _this.config.call_child( $(this), _this );
	            });
	        }else{

	        }
	    },
	    getIsDelegate: function () { //检查是否是代理模式 是-true 否-false
	        return this.config.delegate.isDelegate;
	    },
	    setAllBtnStatus: function () { //设置全选按钮的状态
	        if(!this.config.isHasHiddenInp){ //没有隐藏的输入框（向后端传值）
	            if( this.getChildSelectdLength() > 0 ){
	                $(this.config.allBtn).addClass(this.config.btnSelectedClass);
	            }else{
	                $(this.config.allBtn).removeClass(this.config.btnSelectedClass);
	            }
	        }else{

	        }
	    },
	    getChildSelectdLength: function () { //获取子按钮选中状态的个数
	        var iChildSlectedLen = $(this.config.childBtn + "." + this.config.btnSelectedClass).length; //获取子按钮选中状态的长度
	        return iChildSlectedLen;
	    },
	    getChildSelectdData: function (sAttr) { //对外方法(默认取配置信息里面配置的参数)--获取已选中的子元素按钮的数据字符串
	        var _this = this;
	        var aChildSlected = $(this.config.childBtn + "." + this.config.btnSelectedClass); //获取已经选中的子按钮
	        var aArr = [];
	        aChildSlected.each(function(idx, el) {
	            aArr.push( $(this).attr( sAttr ? sAttr : _this.config.dataString.attr) );
	        });
	        return aArr.join(_this.config.dataString.fuhao);
	    }
	}

	// 定义一些函数（单独独立完成的函数集合）
	var method = {};

	/**
	 * [checkSty 模拟多选]
	 * @param  {[object]} 配置对象 [配置对象]
	 *   1.unbind: 有两个参数--过滤不希望绑定click事件的元素
	 *     attr：过滤元素的属性
	 *     boo：过滤元素的特定属性值
	 *   2.call: 设置完状态后的回调函数
	 * @return {[null]} [null]
	 */
	method.checkSty = function(opt){
	    var opt = opt || {}; //配置对象
	    var defaul = {
	        unbind: {
	            attr: "data-unbind",
	            boo: "true"
	        }
	    };
	    var config = $.extend({}, defaul, opt);
	    
	    var aCheck = $("[data-role='checkbox']");
	    var aInput = aCheck.find("input.check_box[type='checkbox']");

	    aInput.each(function(i) {
	        if( aInput.eq(i).prop("checked") ){
	            aCheck.eq(i).addClass("on");
	        };
	    });
	    aCheck.click(function(){
	        var aInput = $(this).find('input.check_box');

	        if($(this).attr(config.unbind.attr) == config.unbind.boo){ //过滤不希望绑定click事件的元素
	            return false;
	        }
	        if( !aInput.prop("checked") ){
	            aInput.prop("checked", true);
	            $(this).addClass("on");
	        }
	        else if( aInput.prop("checked") ){
	            aInput.prop("checked", false);
	            $(this).removeClass("on");
	        }
	        config.call && config.call($(this));
	    });
	}

	/**
	 * [checkSty 模拟多选--代理模式]
	 * @return {[null]} [null]
	 */
	method.checkStyDelegate = function(call){
	    var aCheck = $("[data-role='checkbox']");
	    var aInput = aCheck.find("input.check_box");

	    aInput.each(function(i) {
	        if( aInput.eq(i).prop("checked") ){
	            aCheck.eq(i).addClass("on");
	        };
	    });
	    $(document).on("click", "[data-role='checkbox']", function(ev){
	        var oEv = ev || window.event;
	        oEv.stopPropagation();
	        var aInput = $(this).find('input.check_box');

	        if( !aInput.prop("checked") ){
	            aInput.prop("checked", true);
	            $(this).addClass("on");
	        }
	        else if( aInput.prop("checked") ){
	            aInput.prop("checked", false);
	            $(this).removeClass("on");
	        }
	        call && call($(this));
	    });
	}

	/**
	 * [setCheckboxStyleDelegate 模拟多选(checkbox框样式)--代理模式]
	 * @param  {[object]} opt [配置项]
	 *    opt有以下参数
	 *    ele_data_role 多选框选择器
	 *    delegate_ele 事件代理外层元素--冒泡阻止元素
	 *    call 发生点击事件元素状态变化后的回调函数
	 * @return {[null]} [null]
	 */
	method.setCheckboxStyleDelegate = function(opt){
	    var opt = opt || {};
	    var sDeleEle = opt.delegate_ele ? opt.delegate_ele : document; //代理元素
	    var sCheckbox = opt.ele_data_role ? opt.ele_data_role: "checkbox";
	    var aCheck = $("[data-role='"+ sCheckbox +"']");
	    var aInput = aCheck.find("input.check_box");

	    aInput.each(function(i) {
	        if( aInput.eq(i).prop("checked") ){
	            aCheck.eq(i).addClass("on");
	        };
	    });
	    $(sDeleEle).on("click", "[data-role='"+ sCheckbox +"']", function(ev){
	        var oEv = ev || window.event;
	        oEv.stopPropagation();
	        var aInput = $(this).find('input.check_box');

	        if( !aInput.prop("checked") ){
	            aInput.prop("checked", true);
	            $(this).addClass("on");
	        }
	        else if( aInput.attr("checked") ){
	            aInput.prop("checked", false);
	            $(this).removeClass("on");
	        }
	        opt.call && opt.call($(this));
	    });
	}

	/**
	 * [setRadioStyleDelegate 模拟单选选(radio框样式)--代理模式]
	 * @param  {[string]} group [分组名称]
	 * @param  {[object]} opt [配置项]
	 *    opt有以下参数
	 *    delegate_ele 事件代理外层元素--冒泡阻止元素
	 *    call 发生点击事件元素状态变化后的回调函数
	 * @return {[null]} [null]
	 */
	method.setRadioStyleDelegate = function (group, opt) {
	    var opt = opt || {};
	    var sDeleEle = opt.delegate_ele ? opt.delegate_ele : document; //代理元素
	    var aRadio = $("[data-role='radio'][data-group='"+ group +"']");
	    var aInput = aRadio.find("input.radio");

	    aInput.each(function(i) {
	        if( aInput.eq(i).prop("checked") ){
	            aRadio.eq(i).addClass("on");
	        };
	    });
	    $(sDeleEle).on("click", "[data-role='radio'][data-group='"+ group +"']", function (ev) {
	        var oEv = ev || window.event;
	        oEv.stopPropagation();
	        // if(aRadio.length == 0 && aInput.length == 0){ //修复被代理元素还没有渲染出来的情况
	            aRadio = $("[data-role='radio'][data-group='"+ group +"']");
	            aInput = aRadio.find("input.radio");
	        // }

	        aRadio.removeClass("on");
	        $(this).addClass("on");
	        aRadio.find('input.radio').prop("checked", false);
	        $(this).find('input.radio').prop("checked", true);
	        opt.call && opt.call($(this));
	    })
	}

	/**
	 * [radioSty 模拟单选]
	 * @param  {[string]} group [分组名称]
	 * @return {[null]}       [null]
	 */
	method.radioSty = function(group, call){
	    var aRadio = $("[data-role='radio'][data-group='"+ group +"']");
	    var aInput = aRadio.find("input.radio");

	    aInput.each(function(i) {
	        if( aInput.eq(i).prop("checked") ){
	            aRadio.eq(i).addClass("on");
	        };
	    });
	    aRadio.click(function(){
	        aRadio.removeClass("on");
	        $(this).addClass("on");
	        aRadio.find('input.radio').prop("checked", false);
	        $(this).find('input.radio').prop("checked", true);
	        call && call($(this));
	    });
	}

	/**
	  * [checkSelect 模拟多选框--不带input框]
	  * @param {[string]} obj [表示发生事件的元素集合]
	  * @param {[function]} call [点击事件后的回调]
	 */
	method.checkSelect = function(obj, call){
	    $(obj).click(function() {
	        if($(this).hasClass('on')){
	            $(this).removeClass('on');
	        }else{
	            $(this).addClass('on');
	        }
	        call && call( $(this) );
	    });
	}

	// 定义返回对象
	var oObj = {
		checkBoxSelectAll: checkBoxSelectAll,
		method: method
	};

	return oObj;
});